package log

import (
	"fmt"
	"io"
	"os"
	"path/filepath"
	"runtime"
	"time"
)

// LogLevel 定义日志级别
type LogLevel int

const (
	LevelDebug LogLevel = iota
	LevelInfo
	LevelWarn
	LevelError
)

// Logger 定义日志记录器接口
type Logger interface {
	Debug(format string, args ...interface{})
	Info(format string, args ...interface{})
	Warn(format string, args ...interface{})
	Error(format string, args ...interface{})
	SetLevel(level LogLevel)
	GetLevel() LogLevel
}

// SimpleLogger 实现了Logger接口
type SimpleLogger struct {
	level  LogLevel
	output io.Writer
}

// NewLogger 创建一个新的日志记录器
func NewLogger(level LogLevel) Logger {
	return &SimpleLogger{
		level:  level,
		output: os.Stdout,
	}
}

// SetOutput 设置日志输出目标
func (l *SimpleLogger) SetOutput(w io.Writer) {
	l.output = w
}

// SetLevel 设置日志级别
func (l *SimpleLogger) SetLevel(level LogLevel) {
	l.level = level
}

// GetLevel 获取当前日志级别
func (l *SimpleLogger) GetLevel() LogLevel {
	return l.level
}

// Debug 记录调试级别日志
func (l *SimpleLogger) Debug(format string, args ...interface{}) {
	if l.level <= LevelDebug {
		l.log("DEBUG", format, args...)
	}
}

// Info 记录信息级别日志
func (l *SimpleLogger) Info(format string, args ...interface{}) {
	if l.level <= LevelInfo {
		l.log("INFO", format, args...)
	}
}

// Warn 记录警告级别日志
func (l *SimpleLogger) Warn(format string, args ...interface{}) {
	if l.level <= LevelWarn {
		l.log("WARN", format, args...)
	}
}

// Error 记录错误级别日志
func (l *SimpleLogger) Error(format string, args ...interface{}) {
	if l.level <= LevelError {
		l.log("ERROR", format, args...)
	}
}

// log 内部日志记录方法
func (l *SimpleLogger) log(level, format string, args ...interface{}) {
	timestamp := time.Now().Format("2006-01-02 15:04:05")
	message := fmt.Sprintf(format, args...)

	// 获取调用者信息（文件:行号）
	// 使用Caller(3)跳过日志库的调用栈
	// 0 - 当前函数(log)
	// 1 - 日志方法(Debug/Info/Warn/Error)
	// 2 - 日志包装函数(如全局的Debug/Info)
	// 3 - 实际调用日志的代码
	_, file, line, _ := runtime.Caller(3)
	file = filepath.Base(file) // 只显示文件名，不显示完整路径
	file = filepath.Base(file)

	fmt.Fprintf(l.output, "[%s] [%s] [%s:%d] %s\n",
		timestamp, level, file, line, message)
}

// DefaultLogger 默认的日志记录器实例
var DefaultLogger Logger = NewLogger(LevelInfo)

// SetDefaultLogger 设置默认日志记录器
func SetDefaultLogger(logger Logger) {
	DefaultLogger = logger
}

// Debug 使用默认日志记录器记录调试级别日志
func Debug(format string, args ...interface{}) {
	DefaultLogger.Debug(format, args...)
}

// Info 使用默认日志记录器记录信息级别日志
func Info(format string, args ...interface{}) {
	DefaultLogger.Info(format, args...)
}

// Warn 使用默认日志记录器记录警告级别日志
func Warn(format string, args ...interface{}) {
	DefaultLogger.Warn(format, args...)
}

// Error 使用默认日志记录器记录错误级别日志
func Error(format string, args ...interface{}) {
	DefaultLogger.Error(format, args...)
}
